GVS | B Opleiding tot Verpleegkundige (HBO-V) - voltijd - versie 1.0
Auteur
Theo Bakker, lector Learning Technology & Analytics, De HHs
Publicatiedatum
25 juni 2024
2.1 Inleiding
Na de basis-analyse van de data en het bouwen van de prognosemodellen, gaan we in deze verdiepende analyse dieper in op de factoren van de modellen. Het doel is beter te begrijpen hoe de factoren precies de retentie verklaren. Deze verdiepende factoranalyse heeft 6 stappen:
We lezen de bewerkte dataset in en de modellen die we in de basis-analyse hebben gemaakt.
We maken een explainer om de modellen beter te begrijpen en te kunnen uitleggen. Dit lichten we later in deze pagina toe.
We gebruiken het beste model om de prognose te verklaren en te begrijpen. We kijken naar de bijdrage van de variabelen aan de voorspelling en passen het model toe op de meest voorkomende studenten.
Vervolgens onderzoeken we de stabiliteit van de invloed van de verklarende variabelen met behulp van Shapley waarden.
Daarna onderzoeken we hoe de retentie er anders uit zou kunnen zien als de studenten andere kenmerken zouden hebben met een Ceteris Paribus analyse.
Tot slot onderzoeken we per variabele de variantie van de voorspellingen met een Partial Dependence analyse.
2.2 Voorbereidingen
2.2.1 Laad de data
We laden de bewerkte data en prognosemodellen in voor:
Opleiding: GVS | B Opleiding tot Verpleegkundige (HBO-V), voltijd, eerstejaars - Retentie na 1 jaar
Toon code
## Bepaal de padensData_outputpath <-Get_Model_Outputpath(mode ="data")sFittedmodels_outputpath <-Get_Model_Outputpath(mode ="last-fits")sModelresults_outputpath <-Get_Model_Outputpath(mode ="modelresults")## Laad de data voor de opleiding: data, last fits en model resultsdfOpleiding_inschrijvingen <- rio::import(sData_outputpath, trust =TRUE)lLast_fits <- rio::import(sFittedmodels_outputpath, trust =TRUE)dfModel_results <- rio::import(sModelresults_outputpath, trust =TRUE)# Pas de Retentie variabele aan naar numeric (0/1), # zodat er een explainer van gemaakt kan wordendfOpleiding_inschrijvingen$Retentie <-as.numeric(dfOpleiding_inschrijvingen$Retentie) -1## Maak een lijst van dfPersonaslDfPersona <-list()## Loop over de variabelenlDfPersona <-map(c("Geslacht", "Vooropleiding", "Aansluiting"),~Get_dfPersona(.x)) |>set_names(c("Geslacht", "Vooropleiding", "Aansluiting"))## Laad de persona'sdfPersona_all <-Get_dfPersona()
2.3 Verdiepende analyse van het model
We weten vanuit de basis-analyse welke variabelen van invloed zijn, maar niet hoe en in welke richting ze retentie verklaren: dragen ze sterk bij of juist niet, verhogen of verlagen ze retentie? Om het model beter te begrijpen en te kunnen uitleggen, maken met behulp van het DALEX package een explainer.
DALEX is onder andere ontwikkeld om uit te kunnen leggen welke verklarende variabelen van belang zijn en wat deze voor een effect hebben in een model. Een explainer is een model-onafhankelijke wrapper, geeft inzicht in de voorspellingen van het model en de bijdrage van de variabelen aan de prognose. Een explainer maakt het verder mogelijk om modellen onderling te vergelijken en benchmarken.
2.3.1 Maak een explainer
We gaan nu een stap verder met behulp van het DALEX package. Op basis van het tidymodels model extraheren we de informatie voor de explainer van Dalex.
Toon code
## Extraheer het fitted model en de workflowfitted_model <- last_fit |>extract_fit_parsnip()workflow <- last_fit |>extract_workflow()# Maak een explainerexplain_lf <- DALEX::explain(model = workflow,data = dfOpleiding_inschrijvingen,y = dfOpleiding_inschrijvingen$Retentie,label ="Linear Regression")
Preparation of a new explainer is initiated
-> model label : Linear Regression
-> data : 1976 rows 27 cols
-> target variable : 1976 values
-> predict function : yhat.workflow will be used ( default )
-> predicted values : No value for predict function target column. ( default )
-> model_info : package tidymodels , ver. 1.2.0 , task classification ( default )
-> predicted values : numerical, min = 0.1569268 , mean = 0.6050542 , max = 0.911251
-> residual function : difference between y and yhat ( default )
-> residuals : numerical, min = -0.9086603 , mean = -0.0008031982 , max = 0.8430732
A new explainer has been created!
2.3.2 Toets de Root Mean Square Error na permutaties
De eerste analyse is de Root Mean Square Error (RMSE) na permutaties. - De RMSE(()) is een maatstaf voor de gemiddelde afwijking van de voorspellingen van een model ten opzichte van de werkelijke waarden. Het wordt berekend als de wortel van de gemiddelde kwadratische fout. - RMSE na permutaties** wil zeggen dat de RMSE is berekend na het herhaaldelijk willekeurig herschikken (permuteren) van de variabelen in de dataset en daarmee de voorspellingen. Deze techniek passen we toe om de robuustheid en betrouwbaarheid van het model te evalueren.
Waarom RMSE na permutaties?
Modelvalidatie: Door de variabelen te permuteren en de RMSE te berekenen, kunnen we de prestatie van het model vergelijken met een willekeurige schatting. Een model dat significant beter presteert dan het gemiddelde RMSE na permutaties heeft waarschijnlijk voorspellende kracht.
Overfit detectie: Als de RMSE van het originele model niet veel beter is dan het RMSE na permutaties, kan dit een indicatie zijn dat het model overfit is op de trainingsdata en niet goed generaliseert naar nieuwe data.
De meeste voorspellende factoren en hun RMSE zijn:
Toon code
sPlotPath <-file.path(Get_Plot_Outputpath(plotname ="lf_model_parts_rmse"))## Als de plot niet bestaat of als recreateplots - T, maak dan een nieuwe plotif(!file.exists(sPlotPath) | params$recreateplots ==TRUE) {## Bereken de model parts op basis van de RMSE mp_rmse <-model_parts(explain_lf, loss_function = loss_root_mean_square)## Maak een plot van de RMSE mp_rmse_plot <-Get_RMSE_Plot(mp_rmse)## Bewaar de plotsuppressWarnings(Finalize_Plot(plot_name = mp_rmse_plot,save_filepath = sPlotPath,height_pixels =50+ (15*length(unique(mp_rmse$variable))) ))# ## Toon de bestaande plot knitr::include_graphics(sPlotPath)} else {## Toon de bestaande plot knitr::include_graphics(sPlotPath)}
Het valt op dat de meest voorspellende variabelen ook een hoge RMSE hebben. Dit betekent dat deze variabelen een grote invloed hebben op de voorspelling van het model, maar per toepassing op een individuele student uit het verleden ook sterk kunnen variëren.
2.3.3 Inspecteer variabelen met de meeste invloed
Een volgende analyse is een toepassing van het model op de meest voorkomende student. We kijken eerst naar de meest voorkomende student in het algemeen. Vervolgens analyseren we de meest voorkomende student in meerdere groepen: naar vooropleiding, geslacht, leeftijd en aansluiting, etc. Om de meest voorkomende student te bepalen, gebruiken we de meeste frequente waarden van de verklarende variabelen in de dataset per groep.
Ter illustratie Stel dat we een onderscheid maken tussen mbo en havo studenten, dan bepalen we de mediaan van numerieke variabelen en de frequentste waarde van categorische variabelen. Van de leeftijd kan misschien 20 het vaakst voorkomen, etc. De meest voorkomende student is dus geen daadwerkelijke student, maar een representatie van de groep op basis van de meeste frequente kenmerken.
We kijken hiermee naar de voorspelling van het model per groep en de bijdrage van de verklarende variabelen aan die specifieke voorspelling. Dit geeft een verder inzicht in de werking van het model. Een categorie met 20 studenten of minder laten we buiten beschouwing.
2.3.3.1 Toelichting op de opbouw van de kans op retentie
De opbouw van het model bestaat uit een intercept, gevolgd door verklarende variabelen die een verschil maken ten opzichte van die intercept. De intercept is de basiskans op retentie voor alle studenten. Deze kans is voor de B Opleiding tot Verpleegkundige (HBO-V) voltijd 60,5%. De cumulatieve bijdrage van de variabelen aan de voorspelling kan positief of negatief zijn. Een positieve bijdrage betekent dat de variabele de kans op retentie verhoogt, een negatieve bijdrage betekent dat het de kans op retentie verlaagt.
Het kan zijn dat nieuwe variabelen geen invloed meer hebben op de kans. Dit betekent niet per se dat ze niet belangrijk zijn. Het kan zijn dat de invloed die ze hebben op de kans al is ‘afgevangen’ door variabelen die eerder in het model zijn opgenomen. Een voorbeeld: de variabele Cijfer_CE_VO_missing = Ja betekent dat een student geen VO cijfers heeft voor het centraal schriftelijk examen. Dit geldt voor vrijwel alle MBO studenten. Doordat de variabele Cijfer_CE_VO_missing de kans op retentie net wat sterker beïnvloedt, komt Vooropleiding = MBO niet meer voor als invloedrijke variabele, maar is dit wel de achterliggende reden dat het cijfer ontbreekt.
Uiteindelijk tellen alle verklarende variabelen op tot een definitieve voorspelling die per persoon verschilt, afhankelijk van hun persoonlijke kenmerken per variabele.
2.3.3.2 De meest voorkomende student (totaal)
We kijken eerst naar de meest voorkomende student in de opleiding. We analyseren de kans op retentie voor deze fictieve student en de bijdrage van de variabelen aan die kans. Daarbij tonen we de verdeling van de voorspellingen voor deze student voor alle variabelen en per variabele. Dit laat zien welke variabelen belangrijk zijn, naar welke kant de verdeling neigt en welke spreiding de kansverdeling heeft. Wat betekent dit?
All data - De eerste variabele all data is eigenlijk geen variabele, maar geeft aan wat alle data samen aan kans op retentie voorspellen. Variabelen die daarna bovenaan staan, wegen het zwaarst in de voorspelling van de kans.
Richting - Als de verdeling van de kansen naar de linkerkant van de x-as gaat, draagt deze variabele meer bij aan een toename op de kans op retentie; als deze naar de rechterkant beweegt, draagt deze variabele juist bij aan een afname op de kans op retentie
Spreiding - Als de spreiding breed is, geeft dit aan dat er binnen deze variabele veel variatie is in de kans op retentie en er voorzichtig mee omgegaan moet worden. Als de spreiding heel smal is, betekent dit dat de variabele weinig of geen invloed heeft op de kans op retentie Deze variabelen bevinden zich op de intercept.
Vorm - De vorm achter de variabele (een viool) geeft de verdeling van de kans op retentie weer. Hoe breder de viool-vorm, hoe meer studenten op die locatie een kans op retentie hebben.
2.3.3.3 De meest voorkomende student (per groep)
Nu de algemene opbouw van de kans op retentie bekend is voor de meest voorkomende student, gaan we verder met een analyse van de meest voorkomende studenten per groep.
De volgorde van de variabelen is zo gesorteerd dat per groep de meest voorspellende variabelen bovenaan staat. De volgorde verschilt per groep en geeft inzicht in wat er per groep speelt. De variabelen zijn vaak proxies voor onderliggende verschillen.
Na deze factorentanalyse kijken we naar de stabiliteit van de invloed van de verklarende variabelen. We gebruiken hiervoor Shapley waarden. Anders dan bij de vorige modellen, houdt Shapley rekening met een andere volgorde van de variabelen.
De volgorde van de variabelen is cumulatief (additief) en maakt dus uit voor de bijdrage aan het model: als er een andere variabele al in het model is toegevoegd, heeft dat invloed op de daaropvolgende variabele. Een Shapley analyse permuteert de volgorde van de variabelen om daarmee de verschillen te berekenen in de bijdrage aan de voorspelling. Zo krijgen we nog beter zicht op het belang en de invloed van de individuele variabelen in het voorspelmodel. Variabelen zonder bijdrage hebben we verwijderd.
Toon code
## Bewaar de plotsPlotPath <-file.path(Get_Plot_Outputpath(plotname ="lf_shapley"))## Als de plot niet bestaat of als recreateplots - T, maak dan een nieuwe plotif(!file.exists(sPlotPath) | params$recreateplots ==TRUE) {## Bepaal de Shapley waarden lf_shapley <-predict_parts(explainer = explain_lf,new_observation = dfPersona_all[1, ],type ="shap",B =20 )## Zet deze om naar een dataframe dfShapley <-Get_dfShapley(lf_shapley)## Bouw de plot shapley_plot <-Get_Shapley_Plot(dfShapley)## Sla de plot opsuppressWarnings(Finalize_Plot(plot_name = shapley_plot,save_filepath = sPlotPath,height_pixels =50+ (20*length(unique(dfShapley$variable_name))) ))## Print de bestaande plot knitr::include_graphics(sPlotPath)} else {## Print de bestaande plot knitr::include_graphics(sPlotPath)}
Toelichting:
De variabelen met blauwe balken verhogen de kans op retentie, de variabelen met rode balken verlagen de kans op retentie
De boxplot in iedere balk geeft de spreiding van de bijdrage van de variabelen aan de voorspelling weer. Hoe breder de boxplot, des te meer variatie in de bijdrage van de variabele aan de voorspelling.
De positie van de variabele geeft het belang van de variabele aan in de voorspelling. Hoe hoger de variabele, des te belangrijker de variabele is in de voorspelling.
2.3.5 What-if: een Ceteris Paribus analyse
Vervolgens analyseren we een aantal scenario’s (wat als…). We nemen opnieuw de meest voorkomende studenten, maar beelden nu af hoe de kans op retentie eruit zou zien als telkens een van de variabelen net wat anders was geweest.
Let op!
Dit is de invloed van de variabelen bij de unieke combinatie van deze meest voorkomende student per categorie. Zie voor de invloed van een variabelen ongeacht deze unieke combinatie de analyse van Partial Dependence Profielen in de volgende paragraaf.
Hiervoor houden we steeds alle variabelen gelijk, op één na (ceteris paribus is Latijn voor ‘al het overige gelijk’). Van die ene variabelen passen we de waarden aan en zien dan het effect op de voorspelde kans op retentie Dit geeft beter inzicht in het effect van de individuele variabelen in het model. We voeren deze analyse uit voor numerieke variabelen.
Ter illustratie: Stel dat de student in dit model net een wat hoger eindexamencijfer zou hebben gehad op de middelbare school, wat zou dan de kans op retentie zijn geweest? Het is waarschijnlijk dat de kans op retentie dan hoger zou zijn geweest.
Opnieuw kijken we naar geslacht, vooropleiding en aansluiting. Het kan zijn dat een van de categorieën niet zichtbaar is, dit komt doordat deze dan over elkaar heen vallen.
2.3.5.1 Geslacht
2.3.5.2 Vooropleiding
2.3.5.3 Aansluiting
2.3.6 Partial Dependence analyse
Tot slot analyseren we Partial Dependence. Hierbij onderzoeken we de invloed van individuele variabelen op de kans op retentie, ongeacht de combinatie van de meest voorkomende studenten. Per (numerieke) variabele analyseren we de variantie binnen de kansen op retentie. We gebruiken hiervoor het gemiddelde van alle Ceteris Paribus profielen. Vandaar dat we ook wel spreken over Partial Dependence profielen (PDP’s). We gebruiken voor deze analyse weer het DALEX package.
We analyseren eerst de variabelen voor alle studenten. We tonen niet alleen de gemiddelde lijn, maar ook de lijnen van de individuele CP-profielen. Vervolgens analyseren op dezelfde manier de variabelen per groep: geslacht, vooropleiding en aansluiting.
Toelichting
De gemiddelde lijn geeft de gemiddelde kans op retentie weer voor alle studenten in de dataset voor alle waarden per variabele.
De individuele lijnen geven de kans op retentie weer voor de individuele studenten in de dataset voor alle waarden per variabele. De bandbreedte van de individuele lijnen geeft de spreiding van de kans op retentie weer binnen de variabele. Het toont dat de kans op retentie per student kan verschillen, zelfs als de variabele gelijk is; de richting van het verband is wel gelijk.
Standaard worden 100 willekeurige profielen gekozen om deze afbeeldingen op te bouwen; door deze selectie kan het zijn dat sommige categorieën met weinig observaties in de populatie niet afgebeeld worden.
Doordat lijnen kunnen overlappen kan het zijn dat sommige lijnen niet zichtbaar zijn. De legenda geeft aan welke mogelijke categorieën voorkomen in de analyse.
2.3.6.1 Alle studenten
2.3.6.2 Geslacht
2.3.6.3 Vooropleiding
2.3.6.4 Aansluiting
2.4 Vervolgstappen: kansengelijkheid
De volgende stap (stap 3) is te onderzoeken of er binnen deze opleiding binnen deze modellen kansengelijkheid bestaat.
Dit doen we door de metrieken van de modellen te evalueren voor verschillende groepen studenten, zoals accuraatheid. Als de metrieken van de voorspellingen van het model voor verschillende groepen studenten sterk uiteenloopt kan er sprake zijn van een bias en duiden op kansenongelijkheid. Dit is het onderwerp van de volgende en laatste analyse.
Verantwoording
Deze analyse maakt deel uit van het onderzoek naar kansengelijkheid van het lectoraat Learning Technology & Analytics van De Haagse Hogeschool: No Fairness without Awareness | Het rapport is door het lectoraat ontwikkeld in Quarto 1.4.549. | Template versie: 0.9.1.9000